package data

import (
	"encoding/json"
	"io"
	"land/config" // 你的配置包
	"land/models"
	"log"
	"net/http"
	"os"
	"path/filepath"
	"strconv"
)

// ImageUploadHandler 处理图像上传的 HTTP 函数
func ImageUploadHandler(w http.ResponseWriter, r *http.Request) {
	// 允许跨域请求
	config.AllowCors(w) // 允许跨域请求

	// 限制方法为 POST
	if r.Method != http.MethodPost {
		http.Error(w, "不支持的请求方法", http.StatusMethodNotAllowed)
		log.Printf("请求方法错误: %s", r.Method)
		return
	}
	log.Printf("接收到图像上传请求: %s", r.URL.Path)

	// 解析 multipart/form-data，文件大小限制为 10MB
	err := r.ParseMultipartForm(10 << 20) // 10 MB限制，参数的单位为字节
	if err != nil {
		http.Error(w, "无法解析表单", http.StatusBadRequest)
		log.Printf("解析表单失败: %s", err)
		return
	}
	log.Printf("表单解析成功")

	// 获取 JSON 数据
	jsonData := r.FormValue("data") // "data" 是包含 JSON 的字段名
	var GetUser models.GetUserData
	if err := json.Unmarshal([]byte(jsonData), &GetUser); err != nil {
		http.Error(w, "无效的请求数据", http.StatusBadRequest)
		return
	}
	log.Printf("JSON 数据解析成功: %s", jsonData)

	// 查询用户信息
	var user models.User
	if err := config.Db.Where("username = ?", GetUser.Username).First(&user).Error; err != nil {
		http.Error(w, "用户不存在", http.StatusUnauthorized)
		return
	}

	// 创建用户文件夹
	userFolder := filepath.Join("uploads", strconv.Itoa(int(user.ID)))
	if err := os.MkdirAll(userFolder, os.ModePerm); err != nil {
		http.Error(w, "无法创建用户文件夹", http.StatusInternalServerError)
		log.Printf("创建用户文件夹失败: %s", err)
		return
	}

	// 清除上一次上传的图像（若存在的话）
	oldImagePath := filepath.Join(userFolder, "data.jpg")
	if _, err := os.Stat(oldImagePath); err == nil {
		if err := os.Remove(oldImagePath); err != nil {
			http.Error(w, "无法删除旧图像", http.StatusInternalServerError)
			log.Printf("删除旧图像失败: %s", err)
			return
		}
		log.Printf("已删除旧图像: %s", oldImagePath)
	}

	// 处理上传的图像文件
	file, header, err := r.FormFile("image") // "image" 是表单中 `<input type="file" name="image">`
	if err != nil {
		http.Error(w, "无法获取上传的文件", http.StatusBadRequest)
		log.Printf("获取文件失败: %s", err)
		return
	}
	defer file.Close() // 确保在函数退出时关闭文件

	// 打印文件名
	log.Printf("获取文件成功: %s\n", header.Filename)

	// 生成文件保存路径
	destFilePath := filepath.Join(userFolder, "image.png") // 命名为 image.png

	// 创建目标文件
	destFile, err := os.Create(destFilePath)
	if err != nil {
		http.Error(w, "无法创建文件", http.StatusInternalServerError)
		log.Printf("创建文件失败: %s", err)
		return
	}
	defer destFile.Close() // 确保在函数退出时关闭目标文件

	// 将上传的文件内容复制到目标文件
	_, err = io.Copy(destFile, file)
	if err != nil {
		http.Error(w, "文件保存失败", http.StatusInternalServerError)
		log.Printf("文件保存失败: %s", err)
		return
	}

	// // 清空用户文件夹中的内容
	// files, err := os.ReadDir(userFolder)
	// if err != nil {
	// 	http.Error(w, "无法读取用户文件夹", http.StatusInternalServerError)
	// 	log.Printf("读取文件夹失败: %s", err)
	// 	return
	// }

	// for _, file := range files {
	// 	if !file.IsDir() {
	// 		if err := os.Remove(filepath.Join(userFolder, file.Name())); err != nil {
	// 			http.Error(w, "无法删除文件", http.StatusInternalServerError)
	// 			log.Printf("删除文件失败: %s", err)
	// 			return
	// 		}
	// 	}
	// }
	// log.Printf("已清空用户文件夹")

	// // 处理上传的图像文件
	// for i := 0; ; i++ {
	// 	file, header, err := r.FormFile("image") // "image" 是表单中 `<input type="file" name="image">`
	// 	if err != nil {
	// 		break // 没有更多文件可处理
	// 	}
	// 	defer file.Close() // 确保在函数退出时关闭文件

	// 	// 打印文件名
	// 	log.Printf("获取文件成功: %s\n", header.Filename)

	// 	// 生成文件保存路径
	// 	destFilePath := filepath.Join(userFolder, strconv.Itoa(i+1)+".jpg") // 按照顺序命名为 1.jpg、2.jpg...

	// 	// 创建目标文件
	// 	destFile, err := os.Create(destFilePath)
	// 	if err != nil {
	// 		http.Error(w, "无法创建文件", http.StatusInternalServerError)
	// 		log.Printf("创建文件失败: %s", err)
	// 		return
	// 	}
	// 	defer destFile.Close() // 确保在函数退出时关闭目标文件

	// 	// 将上传的文件内容复制到目标文件
	// 	_, err = io.Copy(destFile, file)
	// 	if err != nil {
	// 		http.Error(w, "文件保存失败", http.StatusInternalServerError)
	// 		log.Printf("文件保存失败: %s", err)
	// 		return
	// 	}
	// }

	// 返回成功响应
	response := map[string]interface{}{
		"id":       user.ID,
		"username": user.Username,
		"userpic":  user.Userpic,
		"fileName": header.Filename,
		"filePath": destFilePath,
	}
	w.WriteHeader(http.StatusCreated)
	json.NewEncoder(w).Encode(response)
}
